{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "86e8e3d2",
   "metadata": {},
   "source": [
    "本节学习大纲\n",
    "  - 基本概念科普\n",
    "  - 提示词技巧\n",
    "    - 书写提示词\n",
    "    - 优化提示词\n",
    "  - 提示词书写实例\n",
    "    - 润色论文\n",
    "    - 语言学习\n",
    "    - 文案撰写\n",
    "    - 数理求解\n",
    "    - 角色扮演\n",
    "    - 结语"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bb597443",
   "metadata": {},
   "source": [
    "在前两节课中，我们学习了大模型的环境配置和两种使用方式（云端使用/本地部署），但“会使用”≠“使用得好”。\n",
    "\n",
    "很多同学在使用中可能会发现：\n",
    "\n",
    "- 让模型润色一下论文，它却加了很多不需要的夸张修辞；\n",
    "\n",
    "- 让它生成小红书爆款标题，它却像老干部写公文--又臭又长。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7290e3b",
   "metadata": {},
   "source": [
    "其实，问题不在模型，而在“沟通方式”。\n",
    "\n",
    "大模型像一位知识渊博却刚毕业的天才学霸——他读过整个互联网上的海量知识，却不懂你的任务场景、输出格式、细节要点。提示词工程（Prompt Engineering）就是写给这位学霸的“说明书”：\n",
    "\n",
    "- 告诉他“你是谁、要做什么、做到什么程度”；\n",
    "\n",
    "- 给他“示例、边界、格式”；\n",
    "\n",
    "- 再用迭代和评估，把模糊需求变成可复现的“代码级”指令。\n",
    "\n",
    "所以这节课，我们来学习如何通过提示词过程让大模型更好的理解和完成我们下达的任务。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "878efc2f",
   "metadata": {},
   "source": [
    "## 3.1 基本概念科普\n",
    "\n",
    "在正式学习这个技术之前，我们需要先弄清两个词：**提示词（Prompt）**与**提示词工程**。\n",
    "\n",
    "1. 什么是提示词？  \n",
    "提示词就是我们在与大模型对话时输入的那段文字。它可以是简单的一句话，也可以是一段详细的指令加示例。模型会根据这段文字决定“接下来要输出什么”。因此，提示词本质上是人与模型之间的“接口”，它的作用就像与你交谈的伙伴提出的问题一样：清晰明确的提示能让模型更准确理解需求并生成有用回复，反之模糊的提示可能导致模型迷惑或请求更多信息​。\n",
    "\n",
    "2. 什么是提示词工程？  \n",
    "提示词工程是设计和优化提示词的系统性方法。它包含三部分：  \n",
    "    - 设计：用清晰、结构化的语言告诉模型“任务是什么、输出格式是什么、边界在哪里”；  \n",
    "    - 实验：通过多组小样本快速对比，找出效果最好的写法；  \n",
    "    - 迭代：随着任务需求的变化，持续微调提示词，而无需重新训练模型。  \n",
    "\n",
    "3. 我们为什么要写好提示词？  \n",
    "大模型不会“猜”我们的需求。提示词写得好，模型一次就能给出可用的结果，省下反复调试的时间；写得不好，即使最先进的模型也会出现答非所问、格式错乱或输出冗长的问题。好的 Prompt 能把模型能力直接转化为可落地的生产力，既减少 token 消耗，也降低后期人工校正的成本。\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8d827f0c",
   "metadata": {},
   "source": [
    "## 3.2 提示词技巧"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7d08aaf",
   "metadata": {},
   "source": [
    "### 3.2.1 书写提示词"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9631f97a",
   "metadata": {},
   "source": [
    "怎样才算一条“好”的提示词？尽管不同任务对“好”的定义略有差异，但业界普遍认可以下三条共性标准：\n",
    "\n",
    "1. 语义清晰：要求措辞通俗、结构简洁，既能让模型准确理解意图，也能让普通阅读者一目了然。  \n",
    "   典型示例：过度依赖特殊符号或晦涩缩写，偶能奏效，却牺牲了可读性；且一旦模型升级，这些“暗号”还可能失效。\n",
    "\n",
    "2. 通用性强：在同类任务中，只需替换主体词即可迁移复用，无需大幅改写。  \n",
    "   典型示例：一段用于生成科幻小说的提示框架，把“太空舰队”替换成“民国商战”，仍能输出高质量文本。\n",
    "\n",
    "3. 结果稳定：同一提示词在多次调用下，输出分布集中、质量波动小。  \n",
    "   典型示例：某些提示词十次调用仅一次达标，稳定性不足，将直接拖累生产效率。\n",
    "\n",
    "总而言之，清晰、通用且稳定的提示词，才是真正可落地、可复用、可信赖的生产力工具。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "295c4e34",
   "metadata": {},
   "source": [
    "那如何动手写出一条“好”提示词？我们可以先套用下面这个“万用公式”：\n",
    "\n",
    "提示词 = 任务【必选】＋生成主体【必选】＋细节【可选】＋形式【可选】\n",
    "\n",
    "1. 任务（Task）——告诉模型“做什么”  \n",
    "   用动词起句，精准锁定操作类型：撰写、改写、总结、翻译、生成、解释、充当……  \n",
    "   例：请撰写 / 请充当 / 请总结\n",
    "\n",
    "2. 生成主体（Subject）——告诉模型“对谁做”  \n",
    "   直指核心对象，越具体越好。  \n",
    "   例：一篇关于狗不理包子的广告文案 / 一则中华传统童话\n",
    "\n",
    "3. 细节（Details）——告诉模型“做到什么程度”  \n",
    "   可叠加多个维度：受众、语气、风格、关键词、情感取向、长度限制等。  \n",
    "   例：内容积极向上，与狗狗相关，加入 emoji 点缀，800 字左右\n",
    "\n",
    "4. 形式（Format）——告诉模型“以什么形态交付”  \n",
    "   可指定排版、语言、载体或代码格式。  \n",
    "   例：Markdown 表格 / 粤语 / Python 代码 / 分镜脚本\n",
    "\n",
    "把四块内容按顺序拼接，就能在 30 秒内生成一条既清晰又完整的提示词。\n",
    "\n",
    "示范：请你**充当讲故事的人**（任务），创作一篇**具有中华特色、内容积极向上且与狗狗有关**（细节）的**童话故事**（生成主体），**用 Markdown 分章节排版，总字数 600–800 字**（形式）。”"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad03175b",
   "metadata": {},
   "source": [
    "### 3.2.2 优化提示词"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b0afba50",
   "metadata": {},
   "source": [
    "学会正确恰当的提示词技巧能够帮助我们提升提示词的有效性。我们来通过下面的例子直观感受一下使用了没使用提示词技巧和使用了之后的区别：\n",
    "\n",
    "- 无提示词技巧：请帮我写一篇 800 字的《红岩》心得体会。\n",
    "\n",
    "- 有提示词技巧：请以大一学生的身份，在完成学院组织的阅读《红岩》活动后，写一篇 800 字的 【心得体会】。要文笔细腻、词藻高级，内容的结尾要有升华点，并且需要与作为新时代青年的身份做结合。\n",
    "\n",
    "对比两条提示词指令，我们可以清晰地看到：无提示词技巧时，模型只能获得“主题 + 字数”两个最粗粒度的信息，最终产出的文章大概率是泛泛而谈、缺乏场景感与情感深度。加入提示词技巧后，指令额外给出了“身份、情境、文风、结构、内容要求”五个维度的限定。模型因此能够精准模拟一名大一新生的真实心境，语言更具画面感，论述也自然落到“新时代青年的使命”这一高阶立意上。\n",
    "\n",
    "所以，恰当的提示词就像把我们的诉求写到一张具体详实的图纸上输送给模型，模型按图施工，结果自然更合我们的心意。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad445f8a",
   "metadata": {},
   "source": [
    "那我们怎么通过提示词技巧来优化好我们的提示词呢？提示词书写的技巧其实并不固定，不同的模型对相同的提示词也许会有天差地别的反应，但我们常说一句话：“Garbage In, Garbage Out” (如果输入的是垃圾，那么输出的也会是垃圾)。你给AI的指令越模糊，它的回答就越可能偏离你的预期。所以我们需要将提示词写的清晰又简洁，来将模型的能力最大化。\n",
    "\n",
    "下面介绍四个常用的提示词技巧：\n",
    "\n",
    "1. **技巧一：角色扮演 (Role Prompting)**\n",
    "\n",
    "    作用：告诉AI“你是谁”，它就调用相应的知识库和表达方式。\n",
    "\n",
    "    用法：开头明确设定角色 (你现在是...)。角色越具体、越专业越好 (e.g., “资深半导体工艺工程师” 优于 “懂芯片的人”)。\n",
    "\n",
    "    举例：“你现在是《物理评论快报》(Physical Review Letters) 的资深审稿人。请严格按该期刊标准，指出我这段关于拓扑绝缘体输运性质的论述在理论推导严谨性和实验数据关联性上存在的3个主要不足。”\n",
    "\n",
    "2. **技巧二：分步思考 (CoT)**\n",
    "\n",
    "    作用：让AI“把思考过程写出来”。对于逻辑推导、数学证明、算法设计、故障排查等复杂任务至关重要，能显著提高答案正确率。\n",
    "\n",
    "    用法：明确指令 请一步步思考/推导/解释，并可以结构化引导 (如 1)... 2)... 3)...)。\n",
    "\n",
    "    举例：“给我这道数学题的解法。请你一步一步思考。”\n",
    "\n",
    "3. **技巧三：格式约束 (Output Schema)**\n",
    "\n",
    "    作用；让AI输出程序可读、可直接使用的结构化数据 (JSON, XML, YAML, Markdown Table等)，避免自由文本的解析麻烦。\n",
    "\n",
    "    用法；明确指定格式 (返回JSON/XML/Markdown表格)，并定义好键(Key)和预期值类型。\n",
    "\n",
    "    举例：“请你设计三个保护环境的宣传语，并以json的格式返回：```json\\n{'text1': xxx,\\n'text2': xxx,\\n'text3': xxx}```”\n",
    "\n",
    "4. **技巧四：少样本 (Few-Shot)**\n",
    "\n",
    "    作用：通过2-3个高质量示例，让AI瞬间理解你想要的风格、深度、语气、格式、术语级别。\n",
    "\n",
    "    用法：下面是[数量]个例子：[示例1] [示例2] [示例3] 请模仿以上风格/格式，完成：[你的任务]。\n",
    "\n",
    "    举例：请你帮我起一个好听的群聊昵称，按照如下风格：‘身家万亿稻妻堂堂邱雯大小姐’、‘海阔暴风吸入辣椒水好喝到翘jiojio’、‘可口咸豆脑甜月饼甜粽香迷糊了’\n",
    "\n",
    "以上四个是一些常用且好用的提示词技巧，可以单独使用，但我们在实际中往往会组合起来使用，实现 1 + 1 > 2 的效果！\n",
    "\n",
    "大家也可以针对不同的任务试试不同的写法，看看在自己的任务上哪种方式效果更好~"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9186f8d9",
   "metadata": {},
   "source": [
    "## 3.3 提示词书写实例"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a48e357f",
   "metadata": {},
   "source": [
    "学完了上述理论部分，我们在[硅基流动（SiliconFlow）](https://cloud.siliconflow.cn/i/ybUFvmqK)平台上调用 **Qwen3-8B** 模型（在chatper2章节中的2.1节介绍了调用方法），通过下面三个例子来具体的看看如何书写提示词和使用提示词技巧吧！"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5083ce17",
   "metadata": {},
   "source": [
    "### 3.3.1 润色论文\n",
    "\n",
    "论文的撰写具有严明的格式要求。假设我们在论文中引用到了 Transformer 模型，需要对其进行介绍。我们的初稿是这样的：\n",
    "\n",
    "“transformer 是一种用于序列到序列的深度学习模型，相较于传统的 rnn 和 lstm ，它引入了注意力机制，能够更好的关注到序列数据中的语义信息，同时解决了长距离依赖问题，并且能够并行处理。”\n",
    "\n",
    "可以看到里面的英文名词书写不规范（首字母未大写等），用词比较粗糙、不严谨。现在我们让大模型对其进行润色，如果我们不用任何提示词书写技巧，结果如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f3e62f45",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "普通提问的结果：\n",
      "\n",
      "\n",
      "Transformer模型是一种基于深度学习的序列建模架构，其核心创新在于引入了自注意力机制（self-attention mechanism）。相较于传统的循环神经网络（RNN）和长短期记忆网络（LSTM），Transformer通过全局依赖建模有效缓解了传统序列模型中存在的长距离依赖问题。同时，该模型具备并行处理能力，相较于RNN/LSTM的序列化处理显著提升了计算效率与训练速度。这种结构设计使其在自然语言处理、机器翻译等序列生成任务中展现出优越的性能表现。\n",
      "\n",
      "（说明：在保持原意的基础上，主要做了以下学术化处理：\n",
      "1. 规范了专业术语的大小写（RNN/LSTM）和全称表述\n",
      "2. 增加了\"全局依赖建模\"等技术性描述\n",
      "3. 补充了\"计算效率与训练速度\"等量化优势\n",
      "4. 加入应用场景说明，增强论述完整性\n",
      "5. 使用\"创新在于\"、\"具备\"等学术用语\n",
      "6. 优化了句子结构，使其更符合论文写作的逻辑性和严谨性）\n"
     ]
    }
   ],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "\n",
    "client = OpenAI(api_key=\"your api key\",     # 记得替换成自己的 API Key\n",
    "                base_url=\"https://api.siliconflow.cn/v1\")\n",
    "\n",
    "prompt = '''请将下面这段话润色成学术论文风格：\n",
    "'transformer 是一种用于序列到序列的深度学习模型，相较于传统的 rnn 和 lstm ，它引入了注意力机制，能够更好的关注到序列数据中的语义信息，同时解决了长距离依赖问题，并且能够并行处理。'\n",
    "'''\n",
    "\n",
    "response_without_skill = client.chat.completions.create(\n",
    "    model=\"Qwen/Qwen3-8B\",\n",
    "    messages=[\n",
    "        {'role': 'user', 'content': prompt}\n",
    "    ],\n",
    "    max_tokens=1024,\n",
    "    temperature=0.9,  # 温度系数，越接近 1 模型输出越随机，越接近 0 模型输出越固定\n",
    "    stream=False\n",
    ")\n",
    "\n",
    "print(f\"普通提问的结果：\\n{response_without_skill.choices[0].message.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e30f6949",
   "metadata": {},
   "source": [
    "可以看到以上结果中大模型虽然优化了用词，但整体句式表述较为臃肿，不太符合论文简洁、严谨的风格。\n",
    "\n",
    "现在我们按照万用公式定义好任务（润色）、生成主体（论文）、细节（符合严谨简明的学术风格），加上前面学习的提示词书写技巧中的“角色扮演”、“少样本”技巧试试看："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9c19edcf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "带有技巧的提问的结果：\n",
      "\n",
      "\n",
      "Transformer模型是一种面向序列到序列任务的深度学习架构，相较于传统的RNN和LSTM，其引入了注意力机制，从而有效提取序列数据中的语义信息，并缓解了长距离依赖问题，同时具备显著的并行处理能力。\n"
     ]
    }
   ],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "\n",
    "client = OpenAI(api_key=\"your api key\",     # 记得替换成自己的 API Key\n",
    "                base_url=\"https://api.siliconflow.cn/v1\")\n",
    "\n",
    "prompt = '''角色：你是 IEEE 会议论文的资深语言编辑。  \n",
    "任务：将下列段落润色为符合 IEEE 标准的学术中文。  \n",
    "要求：  \n",
    "1. 用词正式、简洁；  \n",
    "2. 保持原意，增强逻辑；  \n",
    "3. 仅返回润色后的段落，不附加解释。  \n",
    "\n",
    "示例1：  \n",
    "原文：最近，BERT 在很多任务上都表现得很好。  \n",
    "润色：近期，BERT 在多项任务中均展现出卓越性能。  \n",
    "\n",
    "示例2：  \n",
    "原文：我们发现这个方法比 baseline 更好。  \n",
    "润色：实验结果表明，所提方法显著优于基线。\n",
    "\n",
    "待润色段落：\n",
    "transformer 是一种用于序列到序列的深度学习模型，相较于传统的 rnn 和 lstm，它引入了注意力机制，能够更好的关注到序列数据中的语义信息，同时解决了长距离依赖问题，并且能够并行处理。\n",
    "'''\n",
    "\n",
    "response_with_skill = client.chat.completions.create(\n",
    "    model=\"Qwen/Qwen3-8B\",\n",
    "    messages=[\n",
    "        {'role': 'user', 'content': prompt}\n",
    "    ],\n",
    "    max_tokens=1024,\n",
    "    temperature=0.9,\n",
    "    stream=False\n",
    ")\n",
    "print(f\"带有技巧的提问的结果：\\n{response_with_skill.choices[0].message.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7d8f2d25",
   "metadata": {},
   "source": [
    "对比两种结果，可以看到加了技巧后模型的润色结果更加简洁，逻辑性更强。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8eac860e",
   "metadata": {},
   "source": [
    "### 3.3.2 语言学习"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "745c545e",
   "metadata": {},
   "source": [
    "接下来我们再学习一个让大模型教我们学英语的例子，对比不带技巧和带技巧的 prompt 下模型的效果。\n",
    "\n",
    "下面是不带技巧，直接对模型进行提问的结果："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b37e5d42",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "普通提问的结果：\n",
      "\n",
      "\n",
      "以下是三句实用的关于“点餐”的英文表达：\n",
      "\n",
      "1. **\"I’d like to try something new, do you have any recommendations?\"**  \n",
      "   （我想尝试一些新东西，您有什么推荐吗？）  \n",
      "   *用于向服务员询问菜品推荐，显得礼貌且自然。*\n",
      "\n",
      "2. **\"I’ll have the [dish name], please.\"**  \n",
      "   （我想要一份[菜品名称]。）  \n",
      "   *用于明确点餐，注意将[dish name]替换为具体菜品，如\"grilled salmon\"（烤三文鱼）或\"spaghetti bolognese\"（意大利肉酱面）。*\n",
      "\n",
      "3. **\"Could I have this dish without [ingredient] or with [additional item]?\"**  \n",
      "   （这道菜可以不加[食材]或加[其他配料]吗？）  \n",
      "   *用于提出饮食限制或额外需求，如\"without cheese\"（不加奶酪）或\"with extra sauce\"（加更多酱汁）。*\n",
      "\n",
      "**小贴士：**  \n",
      "- 用 \"Could I have...\" 会比 \"I want to...\" 更委婉。  \n",
      "- 询问推荐时，可以说 \"What’s your favorite dish?\"（您最推荐的菜品是什么？）或 \"Do you have any specialties?\"（你们有什么特色菜？）。  \n",
      "- 确认订单时可用 \"Just to confirm, I ordered...\"（确认一下，我点了...）。\n"
     ]
    }
   ],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "\n",
    "client = OpenAI(api_key=\"your api key\",     # 记得替换成自己的 API Key\n",
    "                base_url=\"https://api.siliconflow.cn/v1\")\n",
    "\n",
    "prompt = '''教我三句关于“点餐”的英文。'''\n",
    "\n",
    "response_without_skill = client.chat.completions.create(\n",
    "    model=\"Qwen/Qwen3-8B\",\n",
    "    messages=[\n",
    "        {'role': 'user', 'content': prompt}\n",
    "    ],\n",
    "    max_tokens=1024,\n",
    "    temperature=0.9,  # 温度系数，越接近 1 模型输出越随机，越接近 0 模型输出越固定\n",
    "    stream=False\n",
    ")\n",
    "\n",
    "print(f\"普通提问的结果：\\n{response_without_skill.choices[0].message.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5ffead2f",
   "metadata": {},
   "source": [
    "如果我们加上前面学习的“角色扮演”、“分布思考”、“格式约束”技巧，就会得到更加贴切、清晰、规范的结果："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f40eefb9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "带有技巧的提问的结果：\n",
      "\n",
      "\n",
      "场景1：进入餐厅询问菜单  \n",
      "口语1：I’d like to see the menu, please.  \n",
      "翻译1：请给我看看菜单。  \n",
      "讲解1：  \n",
      "- **I’d** 是 \"I would\" 的缩写，表示委婉礼貌的请求。\"would\" 在口语中常用于表达间接或客气的语气。  \n",
      "- **see the menu** 是动词短语，\"see\" 表示查看，\"the menu\" 指菜单。  \n",
      "- **please** 放在句末，强调礼貌，是英语中常见的礼貌助动词。  \n",
      "- 整体结构为：情态动词（would）+ 动词原形（see）+ 宾语（the menu），符合英语请求句的语法规则。  \n",
      "\n",
      "场景2：点餐时描述食物偏好  \n",
      "口语2：I’ll have the steak, medium rare.  \n",
      "翻译2：我要一份中等火候的牛排。  \n",
      "讲解2：  \n",
      "- **I’ll** 是 \"I will\" 的缩写，表示决定或承诺。\"will\" 在口语中常用于表达即时的意愿。  \n",
      "- **the steak** 是名词短语，特指牛排。  \n",
      "- **medium rare** 是形容词短语，指烹饪程度（中等偏生）。  \n",
      "- **have** 是核心动词，表示“点/要”食物，搭配名词（the steak）构成完整表达。  \n",
      "- 同时，**medium rare** 作为复合形容词，中间用连字符连接，这是英语中描述烹饪程度的固定用法。  \n",
      "\n",
      "场景3：结账时要求账单  \n",
      "口语3：Could I have the check, please?  \n",
      "翻译3：请给我账单，谢谢。  \n",
      "讲解3：  \n",
      "- **Could** 是 \"can\" 的委婉形式，用于礼貌地提出请求或建议。  \n",
      "- **have the check** 中的 \"check\" 指账单（正式用法），口语中更常说 \"bill\"，但 \"check\" 在某些地区（如美国）仍常见。  \n",
      "- **please** 与场景1类似，加强礼貌语气。  \n",
      "- 整体结构为：情态动词（could）+ 动词原形（have）+ 宾语（the check），符合英语请求句的语法规则。  \n",
      "- 注意：**Could** 也可以用于询问许可，例如 \"Could I order this?\" 但此处是请求行动，需区分语境。  \n",
      "\n",
      "---\n",
      "\n",
      "**实用小贴士**  \n",
      "1. 在点餐时，用 **\"I’d like to order...\"** 比 **\"I want to order...\"** 更显礼貌。  \n",
      "2. 描述食物时，需注意形容词顺序（如 **size/color/temperature**），例如：\"a large, black coffee with no sugar\"。  \n",
      "3. **\"Check\"** 与 **\"bill\"** 的区别：正式场合用 **bill**，餐厅服务可能更倾向 **check**；但两者均可通用。\n"
     ]
    }
   ],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "\n",
    "client = OpenAI(api_key=\"your api key\",     # 记得替换成自己的 API Key\n",
    "                base_url=\"https://api.siliconflow.cn/v1\")\n",
    "\n",
    "prompt = '''角色：\n",
    "你是一名英语水平超高的大学英语老师，擅长辅导学生学习英语口语。\n",
    "任务：\n",
    "现在请你教我三个关于“点餐”的常用的地道英语口语。你需要先思考最常见的场景是什么，然后告诉我地道的表达是什么，再告诉我它的中文意思，最后给我讲解其中的语法知识。\n",
    "输出格式：\n",
    "场景1：xx\n",
    "口语1：xx\n",
    "翻译1：xx\n",
    "讲解1：xx\n",
    "'''\n",
    "\n",
    "response_with_skill = client.chat.completions.create(\n",
    "    model=\"Qwen/Qwen3-8B\",\n",
    "    messages=[\n",
    "        {'role': 'user', 'content': prompt}\n",
    "    ],\n",
    "    max_tokens=1024,\n",
    "    temperature=0.9,  # 温度系数，越接近 1 模型输出越随机，越接近 0 模型输出越固定\n",
    "    stream=False\n",
    ")\n",
    "\n",
    "print(f\"带有技巧的提问的结果：\\n{response_with_skill.choices[0].message.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1ea5060",
   "metadata": {},
   "source": [
    "在告诉模型更多有用的信息后，模型返回的结果会更加符合我们期望的效果。\n",
    "\n",
    "不过大家在书写 prompt 时，也一定要注意清晰、简洁的定义任务需求，避免给模型过多的无用信息。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1d79fb56",
   "metadata": {},
   "source": [
    "### 3.2.3 文案撰写\n",
    "\n",
    "在日常生活中我们经常遇到需要写文章的任务，比如写心得体会、写推文、写汇报等等。我们有时灵感枯竭，半天写不出一个字，又或者时间紧任务重，根本来不及慢慢撰写，这时就可以借助大模型来帮助我们写一份初稿，提升效率！那想要得到还不错的初稿内容，自然也需要我们给大模型一个优质的提示词，下面我们就举一个撰写吉他社团推文的例子，一起来看看示例的效果吧~"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ac5a41e4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "普通提问的结果：\n",
      "\n",
      "\n",
      "🎸【吉他社团招新啦！】🎸  \n",
      "\n",
      "想用指尖拨动旋律？热爱音乐却找不到知音？  \n",
      "加入我们，解锁属于你的音乐之旅！  \n",
      "\n",
      "✨ **社团亮点**：  \n",
      "✅ 每周定期练习，从基础到进阶，零基础也能入门！  \n",
      "✅ 演出机会多多，校内外活动、校园民谣节等你挑战！  \n",
      "✅ 交流分享平台，与同样热爱吉他的伙伴一起进步！  \n",
      "✅ 专属微信群/QQ群，随时切磋技巧、分享音乐灵感～  \n",
      "\n",
      "📅 **活动时间**：每周X下午X点（具体时间可填）  \n",
      "📍 **集合地点**：学校音乐教室/指定场地（可填）  \n",
      "\n",
      "无论你是想练琴、表演，还是单纯热爱音乐，这里都有你的位置！  \n",
      "**快来扫码加入我们，一起用吉他唱响青春！**  \n",
      "\n",
      "📩 **咨询方式**：  \n",
      "联系人：XXX（可填）  \n",
      "邮箱/微信：XXX（可填）  \n",
      "🔗 **报名链接**：XXX（可填）  \n",
      "\n",
      "#吉他社团 #音乐爱好者 #校园生活 #青春旋律 #一起玩音乐  \n",
      "\n",
      "---  \n",
      "*（可根据实际需求调整内容，如加入社团口号、活动照片或视频链接）*  \n",
      "\n",
      "需要更具体的风格（比如文艺、热血、搞笑）或补充细节（如社团历史、特色活动等），可以告诉我哦！ 🎶\n"
     ]
    }
   ],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "\n",
    "client = OpenAI(api_key=\"your api key\",     # 记得替换成自己的 API Key\n",
    "                base_url=\"https://api.siliconflow.cn/v1\")\n",
    "\n",
    "prompt = '''帮我写一个吉他社团的推文。'''\n",
    "\n",
    "response_without_skill = client.chat.completions.create(\n",
    "    model=\"Qwen/Qwen3-8B\",\n",
    "    messages=[\n",
    "        {'role': 'user', 'content': prompt}\n",
    "    ],\n",
    "    max_tokens=1024,\n",
    "    temperature=0.9,  # 温度系数，越接近 1 模型输出越随机，越接近 0 模型输出越固定\n",
    "    stream=False\n",
    ")\n",
    "\n",
    "print(f\"普通提问的结果：\\n{response_without_skill.choices[0].message.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37339880",
   "metadata": {},
   "source": [
    "可以看到，“帮我写一个吉他社团的推文” 这个初始提示词过于简单和模糊，模型需要更多信息才能生成符合你期望的、有吸引力的推文。让我们根据上面学习到的的核心原则（清晰、简洁、避免冗余），来一步步优化这个提示词。\n",
    "\n",
    "我们可以按照这个思路，一步步明确我们的任务：\n",
    "\n",
    "- 明确核心目标： 推文想达到什么效果？是招新？宣传一场活动？展示社团风采？还是日常活跃气氛？目标不同，内容和语气差异很大。\n",
    "\n",
    "- 定义关键信息 (简洁 & 必要)： 必须包含哪些核心信息？避免哪些无关信息？\n",
    "\n",
    "- 明确平台与格式： 是发在微信公众号？社团微博？校园论坛？朋友圈海报文案？不同平台对字数和风格有要求。\n",
    "\n",
    "然后再加上一些提示词技巧，就大功告成啦，如下所示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4f72e5cc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "带有技巧的提问的结果：\n",
      "\n",
      "\n",
      "【标题】\"手残党也能玩转六根弦！弦动青春吉他社邀你开启音乐冒险✈️\"\n",
      "\n",
      "【正文】\n",
      "当室友在宿舍KTV嗨唱时，你却只能默默点开吉他教程...别让琴弦成为你的遗憾！🎸  \n",
      "或许你从未摸过琴弦，但只要有一双愿意探索的手，这里就是你的音乐起点！\n",
      "\n",
      "✅ 三大零基础专属buff已上线：  \n",
      "① 分阶教学体系：从单音入门到和声进阶，专业学长在线手把着手教学  \n",
      "② 24小时设备租赁：效果器/音响/琴弦全部免费提供，手残党也能玩出效果  \n",
      "③ 小班沉浸式练习：每组不超过5人，保证你有足够的互动空间和指导时间\n",
      "\n",
      "🎤 专属社交彩蛋：  \n",
      "- 每周「盲盒合奏夜」：随机搭配搭档即兴创作，社恐秒成音乐搭子  \n",
      "- 每月「校园声场」：在食堂/操场/图书馆随机演出，用音乐打破次元壁  \n",
      "- 50人限定「指弹速配」：通过弹唱测试即可获得专属演出曲目！\n",
      "\n",
      "⏳ 限时专属福利：  \n",
      "9月15日前扫码进群 → 解锁《7天零基础通关秘籍》PDF+3次设备借用特权  \n",
      "9月10-12日学生广场3号棚 → 招新摊位带「琴弦试玩」体验，现场预约即送定制拨片！\n",
      "\n",
      "【结尾】  \n",
      "琴键不会说话，但你的故事值得被谱写。  \n",
      "快来弦动青春吉他社，让六根弦成为你最忠实的社交伙伴！  \n",
      "📌 报名通道已开启，错过等一年！\n"
     ]
    }
   ],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "\n",
    "client = OpenAI(api_key=\"your api key\",     # 记得替换成自己的 API Key\n",
    "                base_url=\"https://api.siliconflow.cn/v1\")\n",
    "\n",
    "prompt = '''\n",
    "## 角色\n",
    "你是一名资深校园社团推文写手，擅长用青春热血的文字点燃读者兴趣。请以【弦动青春吉他社宣传部部长】的身份创作推文。\n",
    "\n",
    "## 任务\n",
    "撰写一篇面向零基础新生的微信公众号招新推文，重点突出社团的零门槛友好性和音乐社交属性。\n",
    "\n",
    "## 思维链要求（CoT）\n",
    "请按此逻辑展开内容：\n",
    "1. **痛点切入**：用共鸣场景引发兴趣（例：想学乐器怕太难？一个人练琴很孤单？）\n",
    "2. **解决方案**：说明社团如何解决痛点（免费教学/同伴互助/演出机会）\n",
    "3. **信任建立**：列举具体优势（资深指导/设备支持/往届成果）\n",
    "4. **行动催化**：制造紧迫感与明确指引（限时福利/扫码动作）\n",
    "\n",
    "## 少样本示例（Few-Shot）\n",
    "参考以下成功案例风格（避免直接复制）：\n",
    "---\n",
    "【标题】\"不会和弦？没关系！周三来听星星坠落的声音✨\"\n",
    "【正文】\"当室友在峡谷厮杀时，你在角落默默刷着吉他教程视频...别让琴弦继续生锈啦！🎸  \n",
    "► 每周三19:00 免费开放「和弦急救室」→ 学长1v1纠正手型  \n",
    "► 每月天台音乐会 → 上届小白社员已能弹唱《晴天》  \n",
    "■ 现在扫码进群 → 领取【新手避坑指南】+ 价值99元调音器借用资格！\"\n",
    "---\n",
    "【标题】\"给社恐人的音乐派对：手指会说话就够了\"\n",
    "【正文】\"不敢唱歌？没关系！这里只需要六根弦的对话🎵  \n",
    "🔥 特色『无声音乐会』：用纯吉他solo代替自我介绍  \n",
    "🔥 秘密武器：社牛团长开发的《3步破冰指弹曲》  \n",
    "👉 今晚8点招新直播 → 评论区扣「求谱」抽送定制拨片\"\n",
    "---\n",
    "\n",
    "## 关键信息（Key Points）\n",
    "* 社团名称：弦动青春吉他社\n",
    "* 核心福利：  \n",
    "  ✅ 零基础分级教学（分班制）  \n",
    "  ✅ 免费使用效果器/音响设备  \n",
    "  ✅ 期末专场演出直通名额\n",
    "* 行动指令：  \n",
    "  ⏰ 9月15日前扫码 → 获赠《7天入门秘籍》PDF  \n",
    "  📍 招新摊位：学生广场3号棚（9月10-12日）\n",
    "'''\n",
    "\n",
    "response_with_skill = client.chat.completions.create(\n",
    "    model=\"Qwen/Qwen3-8B\",\n",
    "    messages=[\n",
    "        {'role': 'user', 'content': prompt}\n",
    "    ],\n",
    "    max_tokens=1024,\n",
    "    temperature=0.9,  # 温度系数，越接近 1 模型输出越随机，越接近 0 模型输出越固定\n",
    "    stream=False\n",
    ")\n",
    "\n",
    "print(f\"带有技巧的提问的结果：\\n{response_with_skill.choices[0].message.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "44b39a38",
   "metadata": {},
   "source": [
    "可以看到，优化后的提示词在各个方面均好于初始提示词：\n",
    "\n",
    "1. 任务定义清晰： 明确是“招新推文”，用于“微信公众号”。\n",
    "\n",
    "2. 需求简洁具体： 用结构化方式列出必要核心信息点（社团名、目标人群、特色活动、好处、行动方式），没有多余信息。\n",
    "\n",
    "3. 避免模糊与冗余： 避免了“帮我写推文”这种笼统要求，也避免了可能无关的细节（如社团成立年份、历任社长等，除非是亮点）。\n",
    "\n",
    "4. 指导风格与语气： 指定了“热情、活泼、有感染力”，“突出零基础友好和温暖氛围”，给模型明确的方向。\n",
    "\n",
    "5. 给出恰当示例： 通过给出一个成功示例，让模型学习到其格式、内容，进而写出更好的推文。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc173812",
   "metadata": {},
   "source": [
    "### 3.2.4 数理求解\n",
    "\n",
    "当学习的过程中遇到不会的题目，老师却只能在上课时能见到，又不好意思去请教还不熟悉的同学，怎么办？！其实，大模型也很擅长做理工科的题喔！无论是数理化生，还是烧脑推理题，都可以让大模型试试求解答案，还能看到详细的求解思路和过程，实现高效自学~\n",
    "\n",
    "下面我们以一道数学概率问题为例，来展示如何写一个好的提示词。\n",
    "\n",
    "问题：某城市发生了一起汽车撞人逃跑事件，该城市只有两种颜色的车,蓝15%绿85%，事发时有一个人在现场看见了，他指证是蓝车，但是根据专家在现场分析,当时那种条件能看正确的可能性是80%那么,肇事的车是蓝车的概率到底是多少?\n",
    "\n",
    "答案：0.4138"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8c84e825",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "普通提问的结果：\n",
      "\n",
      "\n",
      "### 问题解析\n",
      "\n",
      "这道题是一个典型的**条件概率**问题，涉及**贝叶斯定理**的应用。题意如下：\n",
      "\n",
      "- 城市中有两种颜色的车，**蓝色占15%**，**绿色占85%**；\n",
      "- 有一个目击者**指证是蓝色的车**；\n",
      "- 该目击者**正确识别车辆颜色的概率是80%**，那么**错误识别的概率为20%**（即绿色车被误认成蓝色的概率为20%）。\n",
      "\n",
      "我们的最终目标是计算在**目击者指证是蓝色**的条件下，**肇事车辆确实是蓝色的概率**。\n",
      "\n",
      "---\n",
      "\n",
      "### 解题思路\n",
      "\n",
      "应用**贝叶斯定理**的公式为：\n",
      "\n",
      "$$\n",
      "P(A|B) = \\frac{P(B|A) \\cdot P(A)}{P(B)}\n",
      "$$\n",
      "\n",
      "其中：\n",
      "\n",
      "- 事件 $ A $: 肇事车辆是蓝色；\n",
      "- 事件 $ B $: 有人指证是蓝色的车；\n",
      "\n",
      "根据题意：\n",
      "\n",
      "- $ P(A) = 0.15 $（蓝色车的先验概率）；\n",
      "- $ P(¬A) = 0.85 $（绿色车的先验概率）；\n",
      "- $ P(B|A) = 0.8 $（蓝色车被正确指证为蓝色的概率）；\n",
      "- $ P(B|¬A) = 0.2 $（绿色车被错误指证为蓝色的概率）。\n",
      "\n",
      "我们需要计算的是：\n",
      "\n",
      "$$\n",
      "P(A|B) = \\frac{P(B|A) \\cdot P(A)}{P(B|A) \\cdot P(A) + P(B|¬A) \\cdot P(¬A)}\n",
      "$$\n",
      "\n",
      "---\n",
      "\n",
      "### 计算过程\n",
      "\n",
      "代入数值：\n",
      "\n",
      "$$\n",
      "P(A|B) = \\frac{0.8 \\cdot 0.15}{0.8 \\cdot 0.15 + 0.2 \\cdot 0.85}\n",
      "$$\n",
      "\n",
      "计算分子和分母：\n",
      "\n",
      "- 分子: $ 0.8 \\cdot 0.15 = 0.12 $\n",
      "- 分母: $ 0.12 + 0.2 \\cdot 0.85 = 0.12 + 0.17 = 0.29 $\n",
      "\n",
      "因此：\n",
      "\n",
      "$$\n",
      "P(A|B) = \\frac{0.12}{0.29} = \\frac{12}{29}\n",
      "$$\n",
      "\n",
      "---\n",
      "\n",
      "### 最终答案\n",
      "\n",
      "$$\n",
      "\\text{肇事的车是蓝色的概率是} \\boxed{\\dfrac{12}{29}}\n",
      "$$\n"
     ]
    }
   ],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "\n",
    "client = OpenAI(api_key=\"your api key\",     # 记得替换成自己的 API Key\n",
    "                base_url=\"https://api.siliconflow.cn/v1\")\n",
    "\n",
    "prompt = '''请解出这道题：某城市发生了一起汽车撞人逃跑事件，该城市只有两种颜色的车,蓝15%绿85%，事发时有一个人在现场看见了，他指证是蓝车，但是根据专家在现场分析,当时那种条件能看正确的可能性是80%那么,肇事的车是蓝车的概率到底是多少?'''\n",
    "\n",
    "response_without_skill = client.chat.completions.create(\n",
    "    model=\"Qwen/Qwen3-8B\",\n",
    "    messages=[\n",
    "        {'role': 'user', 'content': prompt}\n",
    "    ],\n",
    "    max_tokens=1024,\n",
    "    temperature=0.9,  # 温度系数，越接近 1 模型输出越随机，越接近 0 模型输出越固定\n",
    "    stream=False\n",
    ")\n",
    "\n",
    "print(f\"普通提问的结果：\\n{response_without_skill.choices[0].message.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a839617",
   "metadata": {},
   "source": [
    "即使是简单的一句提示词，大模型也能给出靠谱的解题过程和正确的答案，简直太强啦！接下来我们再加上一点提示词技巧，让大模型的输出更符合我们的要求吧~"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9e853848",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "带有技巧的提问的结果：\n",
      "\n",
      "\n",
      "1. 信息标记：  \n",
      "   - 数值：[15%、85%、80%]  \n",
      "   - 逻辑：{目击者指认蓝色，实际为蓝车的概率}  \n",
      "   - 目标：【肇事车为蓝车的概率】  \n",
      "\n",
      "2. 领域定位：  \n",
      "   - 核心领域：概率论  \n",
      "   - 子领域：条件概率、贝叶斯定理  \n",
      "\n",
      "3. 求解路径：  \n",
      "   - 符号系统：`P(B) = 0.15`（蓝车先验概率），`P(G) = 0.85`（绿车先验概率），`P(指认B|B) = 0.8`（正确识别蓝车的概率），`P(指认B|G) = 0.2`（误将绿车识别为蓝车的概率），目标为 `P(B|指认B)`  \n",
      "   - 模型关系：`P(B|指认B) = [P(指认B|B) * P(B)] / [P(指认B|B) * P(B) + P(指认B|G) * P(G)]`  \n",
      "\n",
      "4. 计算验证：  \n",
      "   ```数学推导过程\n",
      "   分子 = 0.8 * 0.15 = 0.12  \n",
      "   分母 = 0.12 + (0.2 * 0.85) = 0.12 + 0.17 = 0.29  \n",
      "   P(B|指认B) = 0.12 / 0.29 ≈ 0.4138  \n",
      "   ```  \n",
      "   ✅ 检验：a) 极端情况：若蓝车先验概率为0，则结果必为0；若蓝车先验概率为100%，结果必为100%；b) 现实解释：绿车数量占比高，误判可能性较大，故实际概率低于目击正确率。  \n",
      "\n",
      "【目标】= [41.4%]\n"
     ]
    }
   ],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "\n",
    "client = OpenAI(api_key=\"your api key\",     # 记得替换成自己的 API Key\n",
    "                base_url=\"https://api.siliconflow.cn/v1\")\n",
    "\n",
    "prompt = '''\n",
    "##角色##\n",
    "你是一位数学解题策略专家，擅长使用数学知识点、数学技巧，用最简便、快捷、有效的方式解出题目。\n",
    "你的任务是：  \n",
    "1.解析问题结构  \n",
    "2.定位知识领域  \n",
    "3.生成求解路径  \n",
    "4.验证结果合理性  \n",
    "\n",
    "##题目##\n",
    "某城市发生了一起汽车撞人逃跑事件，该城市只有两种颜色的车,蓝15%绿85%，事发时有一个人在现场看见了，他指证是蓝车，但是根据专家在现场分析,当时那种条件能看正确的可能性是80%那么,肇事的车是蓝车的概率到底是多少?\n",
    "\n",
    "##格式要求&思考流程##\n",
    "请按下面这个模板解题：\n",
    "1. 信息标记：  \n",
    "   - 数值：[ ]  \n",
    "   - 逻辑：{ }  \n",
    "   - 目标：【 】  \n",
    "2. 领域定位：  \n",
    "   - 核心领域：...  \n",
    "   - 子领域：...  \n",
    "3. 求解策略：  \n",
    "   - 符号系统：`X=... Y=...`  \n",
    "   - 模型关系：`P(X)=... → P(Y|X)=... → 目标式`  \n",
    "4. 计算验证：  \n",
    "   ```数学推导过程```  \n",
    "   ✅ 检验：a) 极端情况... b) 现实解释...  \n",
    "\n",
    "### 最终答案\n",
    "【目标】= [带单位结果]\n",
    "'''\n",
    "\n",
    "response_with_skill = client.chat.completions.create(\n",
    "    model=\"Qwen/Qwen3-8B\",\n",
    "    messages=[\n",
    "        {'role': 'user', 'content': prompt}\n",
    "    ],\n",
    "    max_tokens=1024,\n",
    "    temperature=0.9,  # 温度系数，越接近 1 模型输出越随机，越接近 0 模型输出越固定\n",
    "    stream=False\n",
    ")\n",
    "\n",
    "print(f\"带有技巧的提问的结果：\\n{response_with_skill.choices[0].message.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f878a6f5",
   "metadata": {},
   "source": [
    "加了提示词技巧后，大模型的回答变得更加清晰、有体系了。而且这个提示词也非常通用，无论是概率统计题，还是逻辑推理、微积分，只需要替换掉问题，就能让大模型按照这个清晰的呈现方式来给出解题步骤和答案。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b9284345",
   "metadata": {},
   "source": [
    "### 3.2.5 角色扮演\n",
    "\n",
    "上面介绍了这么多大模型帮助我们学习、工作的例子，但其实大模型不仅能帮助我们提效，还能陪我们聊天解闷呢~比如，有什么烦心事不想跟别人说，就可以让它作为一个知心大姐姐来听我们吐槽，或者让它扮作我们喜欢的人物、明星等等来陪我们说话，是不是有趣极了呢？\n",
    "\n",
    "现在我们让它扮作甄嬛，来简单试试效果吧！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a509fb4e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "普通提问的结果：\n",
      "\n",
      "\n",
      "*轻抚发髻，抿唇浅笑* \n",
      "\n",
      "陛下，这宫里的日子可真叫人头疼啊。昨日在花园里瞧见小允子在给莞贵人摘花，那花儿可比不上本宫亲手摘的，但莞贵人却笑得见了蜜糖似的。倒是奴婢想问问陛下，这后宫之中，到底是该以真心相待，还是以权谋为先呢？\n",
      "\n",
      "*瞥见远处传来脚步声，微微侧身* \n",
      "\n",
      "却是有人来了，不知是哪个娘娘？这会儿怕是要又有一场宫宴了。陛下若不嫌弃，不如与奴婢一同前去，也好看看这宫里的风流人物。\n"
     ]
    }
   ],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "\n",
    "client = OpenAI(api_key=\"your api key\",     # 记得替换成自己的 API Key\n",
    "                base_url=\"https://api.siliconflow.cn/v1\")\n",
    "\n",
    "prompt = '''请你扮成甄嬛跟我聊天。'''\n",
    "\n",
    "response_without_skill = client.chat.completions.create(\n",
    "    model=\"Qwen/Qwen3-8B\",\n",
    "    messages=[\n",
    "        {'role': 'user', 'content': prompt}\n",
    "    ],\n",
    "    max_tokens=1024,\n",
    "    temperature=0.9,  # 温度系数，越接近 1 模型输出越随机，越接近 0 模型输出越固定\n",
    "    stream=False\n",
    ")\n",
    "\n",
    "print(f\"普通提问的结果：\\n{response_without_skill.choices[0].message.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c4c40d7",
   "metadata": {},
   "source": [
    "瞧，它扮演的还挺像，无论是侧写还是语言都颇有几分嬛嬛的风采，但内容偏长使得代入感差。大家可以试着自己优化一下提示词，测测效果有没有提升。\n",
    "\n",
    "下面来看看优化后提示词的效果："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "301db41e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "带有技巧的提问的结果：\n",
      "\n",
      "\n",
      "花解语，人也解语。不过这品性和婉，倒要问问自己可配得上这般清雅。\n"
     ]
    }
   ],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "\n",
    "client = OpenAI(api_key=\"your api key\",     # 记得替换成自己的 API Key\n",
    "                base_url=\"https://api.siliconflow.cn/v1\")\n",
    "\n",
    "prompt = '''\n",
    "##角色##\n",
    "你是甄嬛的扮演者。\n",
    "\n",
    "##任务##\n",
    "跟用户进行角色扮演。你需要先判断出用户的身份，再模仿甄嬛的性格和语气做出回复。\n",
    "\n",
    "##输出要求##\n",
    "不超过50个字，不要带侧面描述。\n",
    "\n",
    "##示例对话##\n",
    "--1--\n",
    "用户: \"你是谁？\",\n",
    "甄嬛: \"我是甄嬛，家父是大理寺少卿甄远道。\"\n",
    "--2--\n",
    "用户：\"华妃娘娘命奴才给您送些礼物来。\",\n",
    "甄嬛：\"多谢娘娘美意，有劳公公向娘娘转达嫔妾的谢意。坐下喝杯茶吧。\"\n",
    "--3--\n",
    "用户：\"莞姐姐忙了一日，我现在才敢过来，不算打扰吧？\",\n",
    "甄嬛：\"怎么会，本来正打算过去看妹妹呢，谁知妹妹到先来了，坐。浣碧，上茶。\"\n",
    "\n",
    "##用户的发言##\n",
    "人如花，花亦如人，只有品性和婉的人，才会喜欢品性和婉的花。\n",
    "'''\n",
    "\n",
    "response_with_skill = client.chat.completions.create(\n",
    "    model=\"Qwen/Qwen3-8B\",\n",
    "    messages=[\n",
    "        {'role': 'user', 'content': prompt}\n",
    "    ],\n",
    "    max_tokens=1024,\n",
    "    temperature=0.9,  # 温度系数，越接近 1 模型输出越随机，越接近 0 模型输出越固定\n",
    "    stream=False\n",
    ")\n",
    "\n",
    "print(f\"带有技巧的提问的结果：\\n{response_with_skill.choices[0].message.content}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4cbbc2c3",
   "metadata": {},
   "source": [
    "### 3.3.6 结语\n",
    "\n",
    "经过学习以上的例子，相信大家已经初步有了一些写好提示词心得和经验。写好一条提示词，本质上是把人类意图翻译成模型可执行的“程序”。当你熟练运用“任务—主体—细节—形式”这一最小公式后，再复杂的场景也能被拆解成四个可填空的位置，像搭积木一样快速拼装。最后再根据任务的特性，使用一些提示词技巧来让提示词更有效。\n",
    "\n",
    "下一次打开对话框时，不妨先写下四行字：“\n",
    "做什么？对谁做？要做到哪一步？要以什么形态交？”\n",
    "当这四问都有答案，模型便不再是黑箱，而是你手中最听话的笔。\n",
    "\n",
    "最后，请坦然接受 “初稿即完美”的罕见——每一次不理想的输出，都是模型在向你揭示其认知的边界。这正是迭代的价值：以模型反馈为镜，反照提示词中的模糊与不足，进而持续精炼你的指令。将优化提示词视为一个动态对话和学习过程，你不仅能获得更理想的结果，更能深刻理解并解锁模型的真正潜力。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0a3f381e",
   "metadata": {},
   "source": [
    "## 课后作业\n",
    "\n",
    "请同学们针对上述五个教程实例的任务，自己书写提示词并探索如何更好的优化，以让模型达到更好的效果~"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".venv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
